#include "LCD1602.h"


void LCD1602_UserInit(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
	
	//配置控制I/O口
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;	//推挽输出
	GPIO_InitStructure.GPIO_Pin   = RS | RW | EN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(CMD_PROT, &GPIO_InitStructure);
	
	//配置数据I/O口
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;	//推挽输出
	GPIO_InitStructure.GPIO_Pin   = DATA;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(CMD_PROT, &GPIO_InitStructure);	
}

void LCD1602_Write_Cmd_Data(uint8_t cmd, uint8_t data)
{
	if (cmd) //1 数据
	{        
		RS_HIGH;
		RW_LOW;
		EN_LOW;		
		GPIO_Write(DATA_PROT, data); Delay_ms(3);		
		EN_HIGH; Delay_ms(3);
		EN_LOW;		
	}        
	else	 //0 指令
	{
		RS_LOW;
		RW_LOW;
		EN_LOW;		
		GPIO_Write(DATA_PROT, data); Delay_ms(3);		
		EN_HIGH; Delay_ms(3);
		EN_LOW;
	}
}

void LCD1602_Write_Init(void)
{
	LCD1602_Write_Cmd_Data(CMD, 0x38);	//基本设置 显示模式设置
	LCD1602_Write_Cmd_Data(CMD, 0x06);	//显示光标移动位置
	LCD1602_Write_Cmd_Data(CMD, 0x0C);	//开启显示 不显示光标 并且光标不闪烁
	LCD1602_Write_Cmd_Data(CMD, 0x01);	//清除屏幕内容
	LCD1602_Write_Cmd_Data(CMD, 0x80);	//设置起始地址
}

//开启显示
void LCD1602_Open(void)
{
	LCD1602_Write_Cmd_Data(CMD, 0x38);	//基本设置 显示模式设置
	LCD1602_Write_Cmd_Data(CMD, 0x0C);
}

//关闭显示
void LCD1602_Shut(void)
{
	LCD1602_Write_Cmd_Data(CMD, 0x38);	//基本设置 显示模式设置
	LCD1602_Write_Cmd_Data(CMD, 0x08);
}

/**
 * @brief  
 * @param  com  写的地址   //1602 第一行数据0x80~0x8F 第二行数据0xC0~0xCF
 * @param  num  写的长度
 * @param  *dat 写的内容
 * @retval 无
 */
void LCD1602_Write_Word_Display(LCD_InitTypeDef  LCD_InitStructure)
{
	LCD1602_Write_Cmd_Data(CMD, LCD_InitStructure.com);
	for (uint8_t i = 0; i < LCD_InitStructure.num; i ++)
	{
		LCD1602_Write_Cmd_Data(DAT,*LCD_InitStructure.data++);
	}
	
}

void LCD1602_Number_Display(u8 com, u8 num)	//数据范围0~255
{
	const u8 numcode[] = {"0123456789"};	//只读，不可修改
	
	LCD1602_Write_Cmd_Data(CMD, com);
	LCD1602_Write_Cmd_Data(DAT, numcode[num/100]);//数位分离
	LCD1602_Write_Cmd_Data(DAT, numcode[num/10%10]);
	LCD1602_Write_Cmd_Data(DAT, numcode[num%10]);
}





